微服务架构设计模式
Microservices Patterns
李杉杉
02
微服务核心设计模式
挑战问题
模式和模式语言
模式集合及示例
补充模式
微服务架构可观测性模式
微服务架构部署模式
微服务架构可观测性模式
微服务架构部署模式
部署的流程和架构发展变化
20世纪90(企业级Java应用)
微型机时代
开发团队向运维团队提交部署工单(手动部署)
昂贵且重量级的应用服务器,如WebLogic
定期安装补丁并更新软件
21世纪最初10
开源的轻量级Web容器,如 Tomcat
虚拟机开始取代物理机,仍手动部署
2010年后-至今
高度自动化云上虚拟机
更轻量级、一次性资源、用过即丢弃/重建
容器、serverless
DevOps实践和自动化基础设施对微服务的支持
……
部署 可观测性
……
部署 可观测性
上下文
微服务架构包含一组服务
每个服务都部署为一组服务实例,以实现吞吐量和可用性
问题:如何部署?
需求
服务使用各种语言、框架和框架版本编写
需要快速构建、独立部署和扩展服务
服务实例需要相互隔离
需要监控每个服务实例的行为、部署可靠
需要限制服务消耗的资源(CPU 和内存)
尽可能经济高效地部署应用程序
部署模式列表
单主机部署多个服务实例
单主机部署多个服务实例
将服务部署到虚拟机
将服务部署到容器
服务部署平台
无服务器部署
基础设施相关模式组-部署模式
……
部署 可观测性
模式:单主机部署多个服务实例
资源需求冲突的风险
在主机(物理机或虚拟机)上运行不同服务的多个实例。
有多种方法可以在共享主机上部署服务实例,包括:
将每个服务实例部署为一个 JVM 进程。例如,每
个服务实例一个 Tomcat Jetty 实例。
在同一个 JVM 中部署多个服务实例。例如,作为
Web 应用程序或 OSGI 包。
优点:资源利用率相对较高
缺点:
资源需求冲突的风险
依赖版本冲突的风险
难以限制服务实例消耗的资源
在同一个进程中部署多个服务实例,很难监控每个服务
实例的资源消耗,也不可能隔离每个实例
相关模式:
替代模式:单主机部署单个服务实例
……
部署 可观测性
模式:单主机部署单个服务实例
在自己的主机上部署单个服务实例
优点:
服务实例彼此隔离
不存在资源需求或依赖版本冲突的可能性
一个服务实例最多只能消耗单个主机的资源
监控、管理和重新部署每个服务实例非常简单
缺点:
与单主机部署多个服务实例模式相比,资源利用效率可
能较低,因为主机更多
相关模式:
替代模式:单主机部署多个服务实例、无服务器部署
特化模式:将服务部署到虚拟机、将服务部署到容器
Host
……
部署 可观测性
模式:将服务部署到虚拟机
将服务打包为虚拟机镜像,并将每个
服务实例部署为单独的VM
比如Netflix部署流水线将每个服务
打包为一个 EC2 AMI(包含服务运
需要的有内容)
运行时每个服务实例是该镜像实例化
的虚拟机,如EC2 实例
EC2负栽均衡(Elastic Load
Balancer)路由到对应的实例
……
部署 可观测性
优点:
增加实例扩展服务很简单 Amazon Autoscaling
Groups 可以根据负载自动行此
VM 构建服务的技术细节例如有服务都以完全
同的方式动和停止
每个服务实例都隔离的
VM 对服务实例消耗的 CPU 和内存施限制
AWS IaaS 解决为部署和管理虚拟机提供了成熟
丰富的基础设施负载均衡自动缩放
缺点:
资源利用效率较低整台虚拟机
部署速度相对较分钟
系统管理的额外系统运行补丁
相关模式:
替代模式:将服务部署到容器
化模式:单主机部署单个服务实例
……
部署 可观测性
模式:将服务部署到容器
将服务打包为 (Docker) 容器镜像并将每个服务实
例部署到容器
容器一种更现代更轻量级的部署机制系统
级的虚拟化机制
容器在隔离的沙箱中运行的一个或多个进程组
多个容器常在一机器上运行容器共享系统
在容器中运行的进程的来看它就好像在自己
的机器上运行一有独立IP可消除端口冲突
使用Docker 框架定并协调容器资源
Kubernetes Marathon/Mesos Amazon EC2
Container Service
部署过程:
构建Docker镜像:在构建时 部署流水线使用容器
镜像构建工具读取服务代镜像描述
建容器镜像并将镜像仓库
运行Docker镜像:在运行时 从镜像仓库取容
镜像并用于创建容器
……
部署 可观测性
模式:将服务部署到容器
构建Docker镜像
Dockerfile定基础容器镜像系列
安装软件和配置容器的指令建容器
时运行的命令Listing 12.1
Restaurant Service构建镜像的Dockerfile
构建一个包含服务的可执行JAR文件的容器镜像
基础镜像openjdk:8ul71-jre-alpine
安装curl用于健康检查
容器配置:在启动时运行java-jar命令
容器配置:定期调用健康检查端点30s5s
将服务的JARGradle构建目录复制到镜像中
构建容器镜像 docker build命名
-t指定镜像的名称
.指定Docker调用上下文的内容当前目录
将上下文上传到Docker守护进程构建镜像
推送镜像仓库 docker push命名
Docker Hub:公共Docker镜像仓库的示例
私有镜像仓库 Docker Cloud 镜像仓库或
AWS EC2 Container Registr y
运行Docker镜像docker run命令
……
部署 可观测性
优点:
过更容器实例的量可以直接扩展和缩减服务
容器构建服务的技术细节有服务都以完全相同的
方式动和停止
每个服务实例都隔离的
容器对服务实例消耗的 CPU 和内存施限制
容器的构建和动速度非常快
将应用程序打包为 Docker 容器比将其打包为 AMI 100
Docker 容器启动速度明显快于 VM 仅启动应用程序进程而非整
个操作系统
缺点:
量的容器镜像管理工作系统补丁基础设施
部署容器的基础设施不如部署虚拟机的基础设施丰富
相关模式:
替代模式:将服务部署到虚拟机
化模式:单主机部署单个服务实例
……
部署 可观测性
模式:无服务器部署
使用公有云提供的serverless部署机制部署服务
部署细节对用户隐藏用户和其组织不负责管理低级基础设施(无服务器概念
基础设施获取服务代码并运行根据消耗的资源为每个请求付费
需打包代码例如 ZIP 将其上传到部署基础设施
公有云serverless平台:AWS LambdaGoogle Cloud FunctionsAzure Functions
开源serverless框架:Apache OpenwhiskFission on Kubernetes
ü AWS Lambda支持JavaNode.jsC#GoLangPython
ü AWS Lambda函数是无状态服务
……
部署 可观测性
模式:无服务器部署 - AWS Lambda
将服务的代码打包到一个 ZIP 文件中
将其上传到 AWS Lambda
restaurantservice-aws-lambda.zip
实现Restaurant Service服务功能
每一个Lamba函数都有一个请求处理类
ftgo-create-restaurant Lambda函数
CreateRestaurantRequestHandler
当事件发生时AWS Lambda 找函
数的空闲实例没有可用实例则新启动
并调用处理程序函数
AWS Lambda 运行足够的函数实例来
处理负载 使用容器来隔离 lambda
函数的每个实例EC2 上运行
使用AWS Lambda部署Restaurant Service
……
部署 可观测性
优点:
AWS服务集成简单:AWS服务生成事件AWS API Gateway处理HTTP请求的Lambda函数
消除系统管理任务:底层系统管理操作系统或运行时打补丁专注于开发应用程序
弹性伸缩:AWS Lambda运行应用程序所需的多个实例以动态处理负载
基于使用情况的定价:与典型的laaS云不同AWS Lambda请求所消耗的资源收费
缺点:
长尾延迟:AWS Lambda动态运行代码 需花费时间配和启动应用某些请求有高延迟
Java服务通常要至少几秒钟适合对延迟敏感的服务
基于有事件与请求的型:不用于长时间运行的服务使用第三方代理的消服务
相关模式:
模式
单主机部署单个服务实例
……
部署 可观测性
模式:服务部署平台
使用部署平台作为应用程序部署的自动化基础设施
服务抽象一组命名高度可用的服务实例
Docker 框架,包括Docker swarm 模式和
Kubernetes
无服务器平台,例如 AWS Lambd a
PaaS包括Cloud FoundryAWS E lastic
Beanstalk
Docker框架将运行Docker的一组计算变为资源
将容器分配给机器资源管理调度服务管理
相关模式:
后续模式:
将服务部署到虚拟机
将服务部署容器
无服务器部署
……
部署 可观测性
模式:服务部署平台 - Kubernetes
Google2014开源K8s
管理集群主节点和运行服务的普通节点
API服务器Kubernetes交互API服务器与主节点
上运行的其他集群管理软件一运行
应用程序容器在节点上运行每个节点运行多个组件
Pod s:应用程度服务容器
Kubelet建和管理节点上的应用程序容器Pod
Kube-proxy :管理网络 将应用程序路由
Pod 包括Pod负载均衡可以直接使用代理
也可以配置Linux中内iptables路由规
则间接完成路由工作
……
部署 可观测性
小结:选择支持服务求的最轻量级部署模式Serverless容器虚拟机……
模式
优点
缺点
无服务器
消除管理操作系统和运行时状
态的必要
动弹性配
基于请求的定价
长尾延迟
使用基于事件请求的
容器
必须管理操作系统和运行时
管理 Docker编排框架
其底层运行的虚拟机
轻量级,Serverless部署更灵活
延迟可
虚拟机
Amazon EC2等现代云
部署型简单应用程序可能比
Docker编排框架
重量部署速度
使用多的资源
服务部署平台
种后续模式支持
功能强大
额外技术学习和资源成
主机(单
/多)
——
——
……
部署 可观测性
微服务架构可观测性模式
微服务架构部署模式
上下文
机器上、多个服务和服务实例
跨越多服务实例,每个服务行一
个或多个来处
标准式将信息入日志文件,
行为和代码异
服务实例可能无法仍在运行
问题
和应用程序的行为并解决问题?
何检测正在运行的服务实例无法
模式列表
日志聚合
审计日志
应用程序指标
分布跟踪
跟踪
健康检查API
……
部署 可观测性
日志聚合模式
问题:如何理应用程序的行为并解决问题
需求任何解决方案都应该具最小的运行时开
模式日志聚合模式
使用中式日志记录服务聚合来自每个服务实例的日志
搜索分析日志
配置当某些息出现在日志中时发的警报
实例: AWS Clou d Watch , Logstash ( ELK )
缺点
日志需要量的基础设施
相关模式
分布追踪跟踪
……
部署 可观测性
日志记录的基础设施
ELK
Elasticsearch搜索NoSQL数据库
用作日志记录服务器
Logstash聚合服务日志并将
Elasticsearch日志水线
Kibana: Elasticsearch的可化工
开源日志流水线FluentdApache Flume
用如AWS Cloud Watch Logs
……
部署 可观测性
审计日志模式
问题:如何理用户和应用程序的行为并
测定位问题
需求了解用户最近执了哪些操作,帮助
支持、确保合规性、安全性和可行为
模式审计日志模式
逻辑添加审计日志
审核日志条目存在数据库
优点:
户操作的记录
缺点
审计逻辑,使逻辑复杂
相关模式
后续模式:源(实施审计的可靠方式)
……
部署 可观测性
应用程序指标模式
问题:如何理应用程序的行为并测定位问题
需求任何解决方案都应该具最小的运行时开
模式:应用程序指标模式
检测服务以收集各个作的统计信息,在中式指标
服务中聚合指标,提供报告警报聚合指标两种模型:
push - 服务将指标推送指标服务
pull - 指标服务服务中提取指标
实例:Coda Hale/Yammer Java 指标库
Prometheus普罗米修斯)、AWS Clou d Watch
优点:
对应用程序行为的深入洞察
缺点
指标逻辑在一,使加复杂
聚合指标可能需要量的基础设施
相关模式
其他观测性模式
……
部署 可观测性
分布式追踪模式
问题:如何理应用程序的行为并解决问题
需求
部监控只报告总体响应时用次,无法深入
了解各个
何解决都应该具有最的运行时开
求的日志条目分日志
模式分布式追踪模式
记录单次范围以内的信息
为每个分配一个一的 ID
并在提化和分析中式服务器中记录请求如
何从一个服务流向一个服务
日志中包含 ID
记录中服务中求时行的求和
信息(例如开始时结束
……
部署 可观测性
模式分布式追踪模式
Spring Cloud Sleuth - Spring Cloud 应用程
序的分布跟踪
Open Zipkin - 于记录显示跟踪信息的服务
Open Tracing - 于分布跟踪标准 API
优点:
供了系统行为的有用洞察,包括延迟
使开发人员过在聚合日志搜索其外
ID来查看单个何处理的
缺点
聚合和存储追踪数据可能需要量的基础设施
相关模式
日志聚合- ID 包含在每个日志
分布式追踪模式
……
部署 可观测性
异常追踪模式
上下文:处理请求时有时发生错误。发生错误时,
服务实例会抛出异常,其中包含错误堆栈跟踪
问题:如何理应用程序的行为并解决问题
需求
必须开发人员去重、记录调查解决问题
何解决都应该具有最的运行时开
模式异常跟踪模式
中式跟踪服务报告所常,服务聚合
踪异常并开发人员
实例:Sentry DatadogPagerDu ty
优点
更容查看异常并跟踪其解决
缺点
跟踪服务是额外的基础设施
相关模式
日志聚合-记录异常并报告给跟踪服务
……
部署 可观测性
问题:如何正在运行的服务实例无处理请求?
需求:当服务实例失败时应生成警报,请求应该被
路由正常工作的服务实例
模式健康检查API模式
服务/health返回服务健康状况健康检查 API
端点实例Spring Boot Actuator检查
服务实例使用的基础设施服务的状态
主机的状态,例如磁盘空
应用程序特定逻辑
监控服务、服务注册表负载均衡可以定期ping
端点来检查服务实例的健康状况
健康检查API模式
……
部署 可观测性
模式健康检查API模式
使用 Spring Boot Spring Cloud 作为微服务框架
供健康检查端点Spring Boot Actuator实现
配置调/health可扩展健康检查逻辑 HTTP 端点
优点
定期服务实例的健康状况
缺点
全面
服务实例可能在健康检查失败
相关模式
模式:服务注册与发现模式、部署相模式
……
部署 可观测性
小结:
开发人员和运维人员共同负责实可观测性模式
维人员负责可观测性基础设施
日志聚合应用指标追踪分布追踪的服务器
开发人员有责任确保服务是可观测的
健康检查API端点
成日志条目
收集布指标
追踪服务报告异
实现分布追踪
……
部署 可观测性
……
部署 可观测性
……
部署 可观测性
作业(3-4人小组为单位):
1. 取一个开源的服务系统
GitHub检索
Star500
若第二次作经有微服务系统实现可直接使用(需上GitHub
2. 选择合适的部署和可观测性相关模式行实
模式
给出的实践(含效果截图
谢谢观看